最强线上监控诊断Arthas工具常用命令使用实例 |
您所在的位置:网站首页 › arthas jad命令 › 最强线上监控诊断Arthas工具常用命令使用实例 |
1.下载并运行arthas 下载:curl -O https://arthas.aliyun.com/arthas-boot.jar 运行:java -jar arthas-boot.jar 发现容器中集成了skywalking之后,不能运行成功。可以使用另一种方式运行。添加进程id java -jar arthas-boot.jar pid 2.核心变量使用 核心变量是用来配合各个arthas命令使用的,并输出参数的。 params:本次调用参数列表,这是一个数组,如果方法是无参方法则为空数组 target:本次调用类的实例 returnObj: 本次调用返回的对象。当且仅当 isReturn==true 成立时候有效,表明方法调用是以正常返回的方式结束。如果当前方法无返回值 void,则值为 null 核心变量使用都要遵循ognl表达式规则,官网如下: https://commons.apache.org/proper/commons-ognl/language-guide.html 3.dashboard命令 查看该进程下的线程,以及所有堆栈的配置信息,还有运行的环境信息。 参数说明: ID: Java 级别的线程 ID,注意这个 ID 不能跟 jstack 中的 nativeID 一一对应。 NAME: 线程名 GROUP: 线程组名 PRIORITY: 线程优先级, 1~10 之间的数字,越大表示优先级越高 STATE: 线程的状态 CPU%: 线程的 cpu 使用率。比如采样间隔 1000ms,某个线程的增量 cpu 时间为 100ms,则 cpu 使用率=100/1000=10% DELTA_TIME: 上次采样之后线程运行增量 CPU 时间,数据格式为秒 TIME: 线程运行总 CPU 时间,数据格式为分:秒 INTERRUPTED: 线程当前的中断位状态 DAEMON: 是否是 daemon 线程 4.thread 命令 查看当前线程信息,查看线程的堆栈 thread id, 显示指定线程的运行堆栈 thread -b, 找出当前阻塞其他线程的线程,目前只支持找出 synchronized 关键字阻塞住的线程。 thread -n 3 -i 1000 列出 1000ms 内最忙的 3 个线程栈 thread --state WAITING 查看指定状态的线程 5. memory 查看 JVM 内存信息。 6.jad 命令 反编译指定已加载类的源码,在线上可查看代码是否已经部署上去 jad com.zhqc.cloud.frame.core.test.TestController 7.mc命令 Memory Compiler/内存编译器,编译.java文件生成.class。可以结合retransform命令实现热更新代码。 注意,mc 命令有可能失败。如果编译失败可以在本地编译好.class文件,再上传到服务器。具体参考retransform命令说明。 8.retransform命令 加载外部的.class文件,retransform jvm 已加载的类。 retransform 指定的 .class 文件 retransform /tmp/MathGame.class 查看 retransform entry retransform -l 删除所有 retransform entry retransform --deleteAll 结合 jad/mc 命令使用 jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java mc /tmp/UserController.java -d /tmp retransform /tmp/com/example/demo/arthas/user/UserController.class 7.monitor命令 方法执行监控 monitor -c 5 com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter '#cost>1000' -c 5 表示每5秒一次 #cost>1000 表示花费时间超过1000毫秒的方法 monitor -c 5 com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter 'returnObj.code =00000' returnObj.code =00000 代表结果中返回code为00000的方法。 返回参数: timestamp class method total success fail avg-rt(ms) fail-rate ---------------------------------------------------------------------------------------------- 2020-09-02 09:41:57 demo.MathGame primeFactors 1 0 1 0.10 100.00% avg-rt(ms) 为方法平均响应时间 8.stack命令 输出当前方法被调用的调用路径。可以用来找到这个方法,是从哪里被调用的,可以用搭配trace方法一起使用,定位到哪个方法用的耗时比较长。 stack com.zhqc.cloud.frame.core.test.TestController testDubboNetwork -n 3 -n 3 代表只输出3次 stack com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter '#cost>1000' #cost>1000 表示花费时间超过1000毫秒的方法 9.trace命令 方法内部调用路径,并输出方法路径上的每个节点上耗时。trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。虽能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,但其每次只能跟踪一级方法的调用链路。所以需要定位下一级方法的性能,就得多次定位。 trace com.zhqc.cloud.gateway.filter.TestAuthorizationFilter verifyTokenAndSetHeader -n 1 -n 1 代表只输出1次 trace com.zhqc.cloud.frame.core.test.TestController testDubboNetwork '#cost>1000' #cost>1000 表示花费时间超过1000毫秒的方法 10.watch命令 函数执行数据观测。让你能方便的观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。 watch com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter invoke -x 2 -x 2 代表只输出参数的第二层级 stack com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter "{params,returnObj}" -x 2 -b params 入参参数 returnObj 返回结果参数 target 类实例 -b 函数调用之前 -e 函数异常之后 -s 函数返回之后 -f 函数结束之后(正常返回和异常返回) -E 开启正则表达式 #cost 耗时 -v 打印具体的值 --exclude-class-pattern 排除具体的类 11. tt命令 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。tt 相关功能在使用完之后,需要手动释放内存,否则长时间可能导致OOM。退出 arthas 不会自动清除 tt 的缓存 map。清除所有的 tt 记录,tt --delete-all。 tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter 记录下当前方法的每次调用环境现场 INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD ------------------------------------------------------------------------------------------------------------------------------------- 1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d TestAuthorizationFilter filter 1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d TestAuthorizationFilter filter 参数说明: INDEX 时间片段记录编号,每一个编号代表着一次调用,后续 tt 还有很多命令都是基于此编号指定记录操作,非常重要。 TIMESTAMP 方法执行的本机时间,记录了这个时间片段所发生的本机时间 COST(ms) 方法执行的耗时 IS-RET 方法是否以正常返回的形式结束 IS-EXP 方法是否以抛异常的形式结束 OBJECT 执行对象的hashCode(),注意,曾经有人误认为是对象在 JVM 中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体 CLASS 执行的类名 METHOD 执行的方法名 解决方法重载 参数个数 tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter params.length==1 参数类型 tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter 'params[1] instanceof Integer' 解决指定参数 tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter params[0].code=="abs" 对于具体的调用信息查看 tt -i 1000 重复调用 tt -i 1000 -p --replay-times 10 --replay-interval 1000 -p 重复调用 --replay-times 重复调用次数 --replay-interval 重复调用的间隔时间ms 获取到spring context 拦截请求:RequestMappingHandlerAdapter#invokeHandlerMethod tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethodArthas会拦截到这个调用,index是1000 tt -i 1000 -w 'target.getApplicationContext()' @AnnotationConfigEmbeddedWebApplicationContext[ reader=@AnnotatedBeanDefinitionReader[org.springframework.context.annotation.AnnotatedBeanDefinitionReader@35dc90ec], scanner=@ClassPathBeanDefinitionScanner[org.springframework.context.annotation.ClassPathBeanDefinitionScanner@72078a14], annotatedClasses=null, basePackages=null, ] Affect(row-cnt:1) cost in 7 ms.从spring context里获取任意bean,并调用函数 tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()' 最后记得使用完, tt -d 1000 删除该命令占用的内存。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |